package shuimin.weixin.message.model.menu;

import pond.common.STRING;
import pond.db.Model;
import shuimin.weixin.Constant;

import java.util.*;

/**
 * Created by sky on 16/5/18.
 */
public class Menu extends Model {

    {
        field("sub_button");
        field("name");
        field("type");
        field("key");
        field("url");
    }

    /**
     * 创建一个菜单--root,
     *
     * @param name 菜单显示名称
     * @return
     */
    public static Menu createRoot(String name) {
        Menu menu = new Menu();
        menu.set("name", name);
        return menu;
    }

    /**
     * 创建一个菜单--click,
     *
     * @param name 菜单显示名称
     * @param url  链接
     * @param key  如果type为click时 key必填,其他选填
     * @return
     */
    public static Menu createClick(String name, String url, String key) {
        Menu menu = new Menu();
        menu.set("name", name);
        menu.set("url", url);
        if (STRING.isBlank(key)) throw new RuntimeException("key值必填");
        menu.set("key", key);
        menu.set("type",Constant.EVENT_MENU_CLICK);
        return menu;
    }

    /**
     * 创建一个菜单--view,
     *
     * @param name 菜单显示名称
     * @param url  链接
     * @param key  如果type为click时 key必填,其他选填
     * @return
     */
    public static Menu createView(String name, String url, String key) {
        Menu menu = new Menu();
        menu.set("name", name);
        menu.set("url", url);
        if (STRING.notBlank(key)) menu.set("key", key);
        menu.set("type",Constant.EVENT_MENU_VIEW);
        return menu;
    }


    /**
     * 创建一个菜单--scancode_push,
     *
     * @param name 菜单显示名称
     * @param key  如果type为click时 key必填,其他选填
     * @return
     */
    public static Menu createScancodePush(String name,String key) {
        Menu menu = new Menu();
        menu.set("name", name);
        if (STRING.notBlank(key)) menu.set("key", key);
        menu.set("type",Constant.EVENT_MENU_SCAN_PUSH);
        return menu;
    }

    /**
     * 创建一个菜单--scancode_waitmsg,
     *
     * @param name 菜单显示名称
     * @param key  如果type为click时 key必填,其他选填
     * @return
     */
    public static Menu createScancodeWaitmsg(String name, String key) {
        Menu menu = new Menu();
        menu.set("name", name);
        if (STRING.notBlank(key)) menu.set("key", key);
        menu.set("type",Constant.EVENT_MENU_SCAN_WAITMSG);
        return menu;
    }

    /**
     * 创建一个菜单--pic_sysphoto,
     *
     * @param name 菜单显示名称
     * @param key  如果type为click时 key必填,其他选填
     * @return
     */
    public static Menu createPicSysphoto(String name, String key) {
        Menu menu = new Menu();
        menu.set("name", name);
        if (STRING.notBlank(key)) menu.set("key", key);
        menu.set("type",Constant.EVENT_MENU_PIC_SYS);
        return menu;
    }

    /**
     * 创建一个菜单--pic_photo_or_album,
     *
     * @param name 菜单显示名称
     * @param key  如果type为click时 key必填,其他选填
     * @return
     */
    public static Menu createPicAlbum(String name,  String key) {
        Menu menu = new Menu();
        menu.set("name", name);
        if (STRING.notBlank(key)) menu.set("key", key);
        menu.set("type",Constant.EVENT_MENU_PIC_PHOTO);
        return menu;
    }


    /**
     * 创建一个菜单--pic_weixin,
     *
     * @param name 菜单显示名称
     * @param key  如果type为click时 key必填,其他选填
     * @return
     */
    public static Menu createPicWeixin(String name,  String key) {
        Menu menu = new Menu();
        menu.set("name", name);
        if (STRING.notBlank(key)) menu.set("key", key);
        menu.set("type",Constant.EVENT_MENU_PIC_WEIXIN);
        return menu;
    }

    /**
     * 创建一个菜单--location_select,
     *
     * @param name 菜单显示名称
     * @param key  如果type为click时 key必填,其他选填
     * @return
     */
    public static Menu createLocation(String name,  String key) {
        Menu menu = new Menu();
        menu.set("name", name);
        if (STRING.notBlank(key)) menu.set("key", key);
        menu.set("type",Constant.EVENT_MENU_LOCATION);
        return menu;
    }

    public Menu appendChild(Menu... childList) {
        String type = this.get("type");
        if (STRING.notBlank(type)) throw new RuntimeException("事件菜单不能包含子菜单");
        List<Menu> children = this.get("sub_button");
        if (children == null) children = new ArrayList<>();
        if (childList != null) {
            Collections.addAll(children, childList);
        }

        return this;
    }

    public Map<String,Object> parseToWeixin(){
        Map<String,Object> map=new HashMap<>();
        map.put("button",this);
        return map;
    }
}
